import requests
import json
from django.conf import settings
from .models import VideoTask
import logging

logger = logging.getLogger(__name__)


class VolcVideoAPI:
    """
    火山引擎视频生成API封装类
    使用统一API Key + Model ID调用火山引擎视频生成服务
    """
    
    def __init__(self):
        # 使用统一的API Key
        self.api_key = getattr(settings, 'ARK_API_KEY', 'your-api-key-here')
        self.base_url = getattr(settings, 'ARK_BASE_URL', 'https://ark.cn-beijing.volces.com/api/v3')
        self.model_id = getattr(settings, 'ARK_VIDEO_MODEL_ID', 'doubao-seedance-1-0-pro-250528')
        
        # 验证配置
        if self.api_key == 'your-api-key-here':
            logger.warning("使用默认API_KEY，请在settings中配置正确的ARK_API_KEY")

    def create_task(self, user, prompt, resolution='720p', aspect_ratio='16:9', duration=6):
        """
        创建视频任务 - 使用标准API Key + Model ID
        
        Args:
            user: Django用户对象
            prompt: 文字提示词
            resolution: 分辨率 (480p/720p/1080p)
            aspect_ratio: 宽高比 (16:9/9:16/1:1/4:3)
            duration: 时长（秒）
        
        Returns:
            VideoTask: 创建的任务对象
        """
        try:
            logger.info(f"使用火山引擎视频生成API创建任务，用户：{user.username}")
            
            # 将视频参数合并到提示词中，符合火山引擎API要求
            enhanced_prompt = self._build_enhanced_prompt(prompt, resolution, aspect_ratio, duration)
            
            # 构造符合火山引擎视频生成API规范的请求参数
            request_data = {
                "model": self.model_id,
                "content": [
                    {
                        "type": "text",
                        "text": enhanced_prompt
                    }
                ],
                "parameters": {
                    "expire_seconds": 3600  # 视频URL有效期
                }
            }
            
            # 使用标准Authorization Bearer格式
            headers = {
                "Authorization": f"Bearer {self.api_key}",
                "Content-Type": "application/json"
            }
            
            # 调用火山引擎视频生成API
            response = requests.post(
                f"{self.base_url}/contents/generations/tasks",  # 使用正确的视频API端点
                headers=headers,
                data=json.dumps(request_data),
                timeout=30
            )
            
            # 解析响应
            if response.status_code == 200:
                result = response.json()
                
                if 'id' in result:
                    # 创建数据库记录，保存用户输入的规格参数
                    video_task = VideoTask.objects.create(
                        user=user,
                        volc_task_id=result['id'],
                        status=result.get('status', 'queued'),
                        prompt=prompt,
                        resolution=resolution,
                        aspect_ratio=aspect_ratio,
                        duration=duration
                    )
                    
                    logger.info(f"视频任务创建成功，任务ID：{result['id']}")
                    return video_task
                else:
                    raise Exception("API响应中未返回任务ID")
            else:
                error_msg = f"HTTP {response.status_code}: {response.text}"
                raise Exception(error_msg)
                
        except Exception as e:
            logger.error(f"创建视频任务失败：{str(e)}")
            raise Exception(f"创建视频任务失败：{str(e)}")

    def _build_enhanced_prompt(self, prompt, resolution, aspect_ratio, duration):
        """
        根据用户参数构建增强提示词，符合火山引擎API要求
        """
        # 将视频参数转换为火山引擎要求的命令格式
        enhanced_prompt = prompt
        
        # 添加分辨率参数
        if resolution:
            enhanced_prompt += f" --rs {resolution}"
        
        # 添加宽高比参数  
        if aspect_ratio:
            enhanced_prompt += f" --ratio {aspect_ratio}"
            
        # 添加时长参数
        if duration:
            enhanced_prompt += f" --dur {duration}"
            
        return enhanced_prompt

    def query_task(self, video_task):
        """
        查任务进度 - 使用标准API Key + Model ID
        
        Args:
            video_task: VideoTask对象
            
        Returns:
            VideoTask: 更新后的任务对象
        """
        try:
            logger.info(f"查询任务状态，任务ID：{video_task.volc_task_id}")
            
            # 使用标准Authorization Bearer格式
            headers = {
                "Authorization": f"Bearer {self.api_key}",
                "Content-Type": "application/json"
            }
            
            # 构建查询URL，添加get_resource参数获取视频URL
            query_params = {
                "get_resource": "true",  # 获取视频播放/下载URL
                "expire_seconds": "3600"  # URL有效期
            }
            
            # 调用火山引擎视频查询API
            response = requests.get(
                f"{self.base_url}/contents/generations/tasks/{video_task.volc_task_id}", # 使用正确的视频查询端点
                headers=headers,
                params=query_params,
                timeout=30
            )
            
            # 更新任务状态
            if response.status_code == 200:
                result = response.json()
                
                if 'status' in result:
                    video_task.status = result['status']
                    
                    # 如果任务成功完成，提取视频URL
                    if result['status'] == 'succeeded':
                        # 处理各种可能的响应格式
                        video_url = None
                        if result.get('resource') and result['resource'].get('video_url'):
                            video_url = result['resource']['video_url']
                        elif result.get('content') and result['content'].get('video_url'):
                            video_url = result['content']['video_url']
                        elif result.get('output') and result['output'].get('video_url'):
                            video_url = result['output']['video_url']
                        
                        if video_url:
                            video_task.video_url = video_url
                    
                    # 如果任务失败，记录错误信息
                    elif result['status'] == 'failed':
                        error_msg = "视频生成失败"
                        if 'error' in result and result['error']:
                            if isinstance(result['error'], dict):
                                error_msg = result['error'].get('message', error_msg)
                            else:
                                error_msg = str(result['error'])
                        video_task.error_msg = error_msg
                    
                    video_task.save()
                    logger.info(f"任务状态更新成功，状态：{video_task.status}")
            else:
                # API返回错误
                error_msg = f"HTTP {response.status_code}: {response.text}"
                video_task.error_msg = f"查询失败：{error_msg}"
                video_task.save()
                
            return video_task
            
        except Exception as e:
            logger.error(f"查询任务状态失败：{str(e)}")
            video_task.error_msg = f"查询任务状态失败：{str(e)}"
            video_task.status = 'failed'
            video_task.save()
            return video_task

    def get_task_by_id(self, user, volc_task_id):
        """
        根据火山任务ID获取用户的任务
        
        Args:
            user: Django用户对象
            volc_task_id: 火山任务ID
            
        Returns:
            VideoTask: 任务对象
        """
        try:
            return VideoTask.objects.get(
                volc_task_id=volc_task_id, 
                user=user, 
                is_deleted=False
            )
        except VideoTask.DoesNotExist:
            raise Exception("任务不存在或不属于当前用户")